//! 工具模块
//! 
//! 提供通用的工具函数和宏定义

pub mod sync;
pub mod error;
pub mod macros;

use crate::utils::error::YayaError;

/// 通用工具函数
pub struct Utils;

impl Utils {
    /// 初始化工具模块
    pub fn init() -> Result<(), YayaError> {
        info!("初始化工具模块");
        Ok(())
    }
    
    /// 字节序转换：小端序到主机序
    pub fn le_to_host_u32(value: u32) -> u32 {
        #[cfg(target_endian = "little")]
        { value }
        #[cfg(not(target_endian = "little"))]
        { value.swap_bytes() }
    }
    
    /// 字节序转换：主机序到小端序
    pub fn host_to_le_u32(value: u32) -> u32 {
        #[cfg(target_endian = "little")]
        { value }
        #[cfg(not(target_endian = "little"))]
        { value.swap_bytes() }
    }
    
    /// 计算数据的CRC32校验和
    pub fn crc32(data: &[u8]) -> u32 {
        let mut crc = 0xFFFFFFFFu32;
        
        for &byte in data {
            crc ^= byte as u32;
            for _ in 0..8 {
                if crc & 1 != 0 {
                    crc = (crc >> 1) ^ 0xEDB88320;
                } else {
                    crc >>= 1;
                }
            }
        }
        
        !crc
    }
    
    /// 内存拷贝（安全版本）
    pub fn memcpy(dest: &mut [u8], src: &[u8]) -> Result<(), YayaError> {
        if dest.len() < src.len() {
            return Err(YayaError::BufferTooSmall);
        }
        
        dest[..src.len()].copy_from_slice(src);
        Ok(())
    }
    
    /// 内存设置
    pub fn memset(dest: &mut [u8], value: u8) {
        for byte in dest.iter_mut() {
            *byte = value;
        }
    }
}